1、编写中断函数的注意事项
	1）因为不存在进程上下文，所以不能调用可能会引起休眠的函数
	2）因为linux默认不支持中断嵌套，所以中断处理时间要尽可能的短
2、中断延迟处理
	一般在中断函数中只完成一些紧急操作，对于不紧急且比较耗时的操作需要放到中断结束后进行处理，如放到tasklet或
工作队列中
3、tasklet
	tasklet是一种中断延迟手段，在中断程序中可以调度tasklet，当中断程序结束后相应的tasklet回调函数将会被执行，
tasklet是利用软中断实现的，其本质还是处于中断上下文，所以也不能调用可能会引起休眠的函数，但是对执行时间的要求
相对宽松些，如下是tasklet的常用函数：
	/**
	 * 静态定义并初始化一个tasklet
	 * name 变量名
	 * func 回调函数
	 * data 回调函数参数
	 */
	DECLARE_TASKLET(name, func, data)
	/**
	 * 初始化一个tasklet
	 * t 要初始化的 tasklet
	 * func 回调函数
	 * data 回调函数参数
	 */
	void tasklet_init(struct tasklet_struct *t, void (*func)(unsigned long), unsigned long data);
	/**
	 * 调度tasklet
	 * t 要调度的 tasklet
	 */
	void tasklet_schedule(struct tasklet_struct *t)
4、工作队列
	工作队列与tasklet类似，但是工作队列实在进程上下文执行，可以调用可能会引起休眠的函数，但是由于系统中所有工
作队列都由一个或几个内核线程调度，所以也不能在工作队列中进行长久睡眠，如下是工作队列的常用函数：
	/**
	 * 静态定义并初始化一个工作队列
	 * n 变量名
	 * f 工作队列回调函数
	 */
	DECLARE_WORK(n, f)
	/**
	 * 初始化工作队列
	 * work 要初始化的工作队列
	 * _func 工作队列回调函数
	 */
	INIT_WORK(_work, _func)
	/**
	 * 调度工作队列
	 * work 要调度的工作队列
	 */
	bool schedule_work(struct work_struct *work)


